home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
string.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-10
|
6KB
|
256 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
/* 文字列処理関係 */
/* 表示した時の半角スペース数 */
int
string_disp_len(STR s)
{
#asm
XCODE_UP equ $0ff * 拡張コードの開始 */
XCODE_MARK equ $020 * マーク 0x20 - 0x29 */
XCODE_SYSMARK equ $030 * システムマーク 0x30 - 0x3f */
XCODE_MARKLAST equ $03f * マークの最後 */
XCODE_UL equ $040 * 下線 */
XCODE_RB10 equ $050 * 予約:1文字真ん中ルビ */
XCODE_RB1 equ $051 * 1文字ルビ(半角用) */
XCODE_RB1L equ $052 * 1文字ルビ左(全角用) */
XCODE_RB1R equ $053 * 1文字ルビ右(全角用) */
XCODE_RB2 equ $054 * 2文字ルビ(全角用) */
movem.l d1-d2/a0,string_disp_len_save
moveq.l #0,d0 * d0 returns disp length
move.l 4(sp),a0 * a0 = pointer to string
USERL16:
move.b (a0)+,d1 * 1 byte move
bmi USERL40 * 2 byte code check
beq USERL30 * eof then return
addq.l #1,d0 * anyway add 1
cmp.b #$20,d1 * control code ?
bge USERL16 * normal 1 byte code($20 - $7f)
cmp.b #'I'-'@',d1 * TAB
bne USERL17
*0-7 -> 8, 8-15 -> 16...
*already add 1 then 1-8 -> 8, 9-16 -> 16...
* addq.l #7,d0
add.w _TAB_LENGTH_1,d0
* andi.w #%1111_1111_1111_1000,d0 * mask
* d0 から d0 mod TAB_LENGTH を引く
move.l d0,d2 * コピー
divu.w _TAB_LENGTH,d2
swap d2
sub.w d2,d0
bra USERL16
USERL17
addq.l #1,d0 * control code is 2 disp_length
bra USERL16
USERL40:
cmp.b #$ff,d1 * xcode ?
bne USERL405 * not xcode
move.b (a0)+,d1 * get next byte
beq USERL30
cmp.b #XCODE_UL,d1 * 2 byte xcode ?
ble USERL16 * underline -> loop again
cmp.b #XCODE_RB1R,d1 * ....
bgt USERL403
tst.b (a0)
beq USERL30
tst.b 1(a0)
beq USERL30
addq.l #2,a0 * 1 char RUBI
bra USERL16
USERL403: * 2 char RUBI
tst.b (a0)
beq USERL30
tst.b 1(a0)
beq USERL30
tst.b 2(a0)
beq USERL30
tst.b 3(a0)
beq USERL30
addq.l #4,a0
bra USERL16
USERL405:
addq.l #1,d0 * anyway add 1
cmp.b #$a0,d1
blt USERL41
cmp.b #$e0,d1
blt USERL16 * normal katakana
tst.b (a0)+ * next byte
beq USERL30
cmp.b #$f0,d1 * 1/4 kaku ?
bge USERL16
addq.l #1,d0 * normal zenkaku(block 2)
bra USERL16
USERL41:
tst.b (a0)+ * next byte
beq USERL30
cmp.b #$80,d1 * hankaku hiragana ?
beq USERL16
addq.l #1,d0 * normal zenkaku(block 1)
bra USERL16
USERL30:
movem.l string_disp_len_save,d1-d2/a0
rts
.data
.even
string_disp_len_save
ds.l 3
#endasm
}
int
string_1or2_byte_code(UINT c)
{
if (c >= 0x100) {
c >>= 8;
}
if (c && (iskanji(c) || buff_ishan2byte(c))) {
/* 漢字の1バイト目? or 2バイト半角文字 */
return(2);
}
return(1); /* EOS は1バイトコード */
}
/* 最初に見つかった拡張コードのアドレスを返す */
/* なければ NULL を返す */
STR
string_search_xcode(register STR p)
{
while(*p) {
if (*p == XCODE_UP) {
return(p);
} else {
p += etc_char_byte_haba(p);
}
}
return((STR) NULL);
}
/* 2つの行の間で送り出しがあるかどうかをチェックする */
/* -1など = 前へ送った、0 = 送り無し、1など = 後ろへ送った */
int
string_2unit_check(UNIT *p1,UNIT *p2)
{
UBYTE w1[VERY_LONG_LINE],w2[VERY_LONG_LINE];
line_get_body(w1,p1);
line_get_body(w2,p2);
return(string_2line_check(w1,w2));
}
/* 2つの行の間で送り出しがあるかどうかをチェックする */
/* -1 = 前へ送った、0 = 送り無し、1 = 後ろへ送った */
int
string_unit_line_check(UNIT *p1,STR s2)
{
UBYTE w1[VERY_LONG_LINE];
line_get_body(w1,p1);
return(string_2line_check(w1,s2));
}
/* 2つの文字列の間で送り出しがあるかどうかをチェックする */
/* - = 前へ送った、0 = 送り無し、+ = 後ろへ送った */
/* 送ったバイト数を返す */
int
string_2line_check(STR s1,STR s2)
{
UBYTE w[VERY_LONG_LINE * 2],w0[VERY_LONG_LINE * 2];
int l2;
strcpy(w,s1);
l2 = strlen(s2);
strcat(w,s2);
return(cut_line(w,w0,w,CURRENT_JIZUME) - l2);
}
/* メインの文字列だけにする */
/* 使わないけど文字列の長さを返すかも知れない */
int
string_to_main_string(STR d,STR s)
{
register UBYTE c;
while(1) {
if (c = *s++) { /* 終了ではない */
if (c == XCODE_UP) {
switch(*s++) {
case XCODE_MARK+0:
case XCODE_MARK+1:
case XCODE_MARK+2:
case XCODE_MARK+3:
case XCODE_MARK+4:
case XCODE_MARK+5:
case XCODE_MARK+6:
case XCODE_MARK+7:
case XCODE_MARK+8:
case XCODE_MARK+9: /* マーク 0x20 - 0x29 */
case XCODE_MARK+10:
case XCODE_MARK+11:
case XCODE_MARK+12:
case XCODE_MARK+13:
case XCODE_MARK+14:
case XCODE_MARK+15:
case XCODE_SYSMARK+0: /* システムマーク */
case XCODE_SYSMARK+1:
case XCODE_SYSMARK+2:
case XCODE_SYSMARK+3:
case XCODE_SYSMARK+4:
case XCODE_SYSMARK+5:
case XCODE_SYSMARK+6:
case XCODE_SYSMARK+7:
case XCODE_SYSMARK+8:
case XCODE_SYSMARK+9:
case XCODE_SYSMARK+10:
case XCODE_SYSMARK+11:
case XCODE_SYSMARK+12:
case XCODE_SYSMARK+13:
case XCODE_SYSMARK+14:
case XCODE_SYSMARK+15:
break;
case XCODE_UL: /* 下線 */
break;
case XCODE_RB10: /* 予約:1文字真ん中ルビ */
case XCODE_RB1: /* 1文字ルビ */
case XCODE_RB1L: /* 1文字ルビ左(全角用) */
case XCODE_RB1R: /* 1文字ルビ右(全角用) */
s += 2; /* ルビであるから、2バイト文字 */
break;
case XCODE_RB2: /* 2文字ルビ(全角用) */
s += 4; /* ルビであるから、2バイト文字 */
}
} else {
if (isprkana(c) || (c < 0x20)) {
/* 普通の1バイトコード */
*d++ = c;
} else { /* 2バイトコード:もしくは拡張 */
*d++ = c;
*d++ = *s++;
}
}
} else {
*d = EOS;
break; /* EOS で終わり */
}
}
}